package com.itttq.kb.utils;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;

import javax.imageio.ImageIO;

import org.springframework.web.multipart.MultipartFile;

import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGEncodeParam;
import com.sun.image.codec.jpeg.JPEGImageEncoder;
/** 
* 图片压缩工具类
* @author 迷蝶 
*/ 
@SuppressWarnings("restriction")
public class CompressImgUtil {
	/** 
	 * 压缩文件质量（肉眼几乎无法分辨，但是尺寸可以少一半以上），同时根据设置宽度等比缩放图片尺寸
	* @param f 图片文件
	* @param targetDir 图片目标目录 
	* @param per 压缩比-取值范围0~1，越小则表示压缩越厉害，同时质量也损失得越厉害。
	* @param w 目标宽度
	*/ 
	public static void  compress(MultipartFile f, float per, Integer width, String targetPath){
		Image src;
		try {
			src = ImageIO.read(f.getInputStream()); //构造Image对象
			// 获取文件名
			String fileName = targetPath.substring(targetPath.lastIndexOf("/") + 1);
			String fileType = targetPath.substring(targetPath.lastIndexOf(".") + 1);
			// 排除其他图片文件类型
			if(!fileType.equalsIgnoreCase("png") && !fileType.equalsIgnoreCase("bmp") 
					&& !fileType.equalsIgnoreCase("jpeg") 
					&& !fileType.equalsIgnoreCase("jpg") 
					&& !fileType.equalsIgnoreCase("gif")) {
				return;
			}
			int w=src.getWidth(null); //得到源图宽
			int h=src.getHeight(null);
			// 处理图片宽高，根据设置来等比缩放
			if(width != null && width > 0 && w > width) {
				h = width * h / w;
				w = width;
			}
			BufferedImage tag = new BufferedImage(w, h,BufferedImage.TYPE_INT_RGB);	            	              
			tag.getGraphics().drawImage(src.getScaledInstance(w, h,  Image.SCALE_SMOOTH), 0,0,null);
			File dir = new File(targetPath.replace(fileName, ""));
			// 判断目标目录是否存在，不存在则创建
			if(!dir.exists()) {
				dir.mkdir();
			}
			FileOutputStream newImage=new FileOutputStream(targetPath); //输出到文件流 
			JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(newImage); 
			JPEGEncodeParam jep=JPEGCodec.getDefaultJPEGEncodeParam(tag);
			/* 压缩质量 */ 
			jep.setQuality(per, true); 
			encoder.encode(tag, jep);
			// 此处应该是单独获取异常，避免因为异常导致未关闭
			newImage.flush();
			newImage.close(); 
		} catch (Exception ex) {
			ex.printStackTrace();
		} 
 }
}